﻿using System;
using System.Collections.Generic;
using System.Linq;
using JPSOFTWARE.BON.Modelos;
using JPSOFTWARE.BON.Modelos.Interfaces;
using DAL;
using System.Data.Common;
using Modelos;


namespace JPSOFTWARE.BON.DAL
{
    public class ProdutosDAL : BaseDAL, IProdutos
    {
        readonly dbBONDataContext _dbBon = null;

        public ProdutosDAL()
        {
            _dbBon = new dbBONDataContext(StringConexao());
        }        

        public bool RegistrarProduto(RegistrarProdutosModel registrarProdutoModel)
        {
            bool retorno = false;

            try
            {
                var tbProdutoDistribuidora = new TBL_PRODUTO_DISTRIBUIDORA
                    {
                        COD_PRODUTO = registrarProdutoModel.IdProduto,
                        COD_DISTRIBUIDORA = registrarProdutoModel.IdDistribuidora,
                        VL_UNITARIO = Convert.ToDecimal(registrarProdutoModel.ValorUnitario.Replace("R$", "")),
                        ST_ATIVO = registrarProdutoModel.NomeSituacao,
                        DH_ALTERACAO = DateTime.Now
                    };

                _dbBon.TBL_PRODUTO_DISTRIBUIDORAs.InsertOnSubmit(tbProdutoDistribuidora);
                _dbBon.SubmitChanges();

                retorno = true;
            }
            catch (Exception ex)
            {
                throw ex;
            }

            return retorno;
        }

        public bool RegistrarProdutosAdministrar(RegistrarProdutosModel registrarProdutoModel)
        {
            bool retorno = false;

            try
            {
                var tbProduto = new TBL_PRODUTO
                {
                    COD_SUB_CATEGORIA = registrarProdutoModel.IdSubCategoria,
                    NM_PRODUTO = registrarProdutoModel.NomeProduto,
                    ST_ATIVO = registrarProdutoModel.NomeSituacao,
                    DH_ALTERACAO = DateTime.Now
                };

                _dbBon.TBL_PRODUTOs.InsertOnSubmit(tbProduto);
                _dbBon.SubmitChanges();

                retorno = true;
            }
            catch (Exception ex)
            {
                throw ex;
            }

            return retorno;
        }

        public AlterarProdutosModel AlterarProdutoAdministrar(int IdProduto)
        {
            AlterarProdutosModel alterarProdutoModel = new AlterarProdutosModel();

            try
            {
                var consulta = (from p in _dbBon.TBL_PRODUTOs join 
                                sc in _dbBon.TBL_SUB_CATEGORIAs on
                                p.COD_SUB_CATEGORIA equals sc.COD_SUB_CATEGORIA
                                join c in _dbBon.TBL_CATEGORIAs on
                                sc.COD_CATEGORIA equals c.COD_CATEGORIA
                                where p.COD_PRODUTO.Equals(IdProduto)
                                select new AlterarProdutosModel
                                {
                                    IdProduto = p.COD_PRODUTO,                                    
                                    IdCategoria = sc.COD_CATEGORIA,
                                    IdSubCategoria = sc.COD_SUB_CATEGORIA,
                                    NomeProduto = p.NM_PRODUTO,                                    
                                    NomeSituacao = (bool)p.ST_ATIVO,
                                    DataAlteracao = (DateTime)p.DH_ALTERACAO
                                }).FirstOrDefault();

                if (consulta != null)
                {
                    alterarProdutoModel.IdProduto = consulta.IdProduto;                    
                    alterarProdutoModel.IdCategoria = consulta.IdCategoria;
                    alterarProdutoModel.IdSubCategoria = consulta.IdSubCategoria;
                    alterarProdutoModel.NomeProduto = consulta.NomeProduto;                    
                    alterarProdutoModel.NomeSituacao = consulta.NomeSituacao;
                    alterarProdutoModel.DataAlteracao = consulta.DataAlteracao;
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
            return alterarProdutoModel;
        }

        public AlterarProdutosModel AlterarProduto(int IdProduto, int IdDistribuidora)
        {
            AlterarProdutosModel alterarProdutoModel = new AlterarProdutosModel();

            try
            {
                var consulta = (from d in _dbBon.TBL_DISTRIBUIDORAs
                                join pd in _dbBon.TBL_PRODUTO_DISTRIBUIDORAs on
                                d.COD_DISTRIBUIDORA equals pd.COD_DISTRIBUIDORA
                                join p in _dbBon.TBL_PRODUTOs on
                                pd.COD_PRODUTO equals p.COD_PRODUTO
                                join sc in _dbBon.TBL_SUB_CATEGORIAs on
                                p.COD_SUB_CATEGORIA equals sc.COD_SUB_CATEGORIA
                                join c in _dbBon.TBL_CATEGORIAs on
                                sc.COD_CATEGORIA equals c.COD_CATEGORIA
                                where pd.COD_PRODUTO.Equals(IdProduto) && pd.COD_DISTRIBUIDORA.Equals(IdDistribuidora)
                                select new AlterarProdutosModel
                                {
                                    IdProduto = pd.COD_PRODUTO,
                                    IdDistribuidora = pd.COD_DISTRIBUIDORA,
                                    IdCategoria = sc.COD_CATEGORIA,
                                    IdSubCategoria = sc.COD_SUB_CATEGORIA,
                                    NomeProduto = p.NM_PRODUTO,
                                    ValorUnitario = pd.VL_UNITARIO.ToString(),
                                    NomeSituacao = pd.ST_ATIVO,
                                    DataAlteracao = pd.DH_ALTERACAO
                                }).FirstOrDefault();

                if (consulta != null)
                {
                    alterarProdutoModel.IdProduto = consulta.IdProduto;
                    alterarProdutoModel.IdDistribuidora = consulta.IdDistribuidora;
                    alterarProdutoModel.IdCategoria = consulta.IdCategoria;
                    alterarProdutoModel.IdSubCategoria = consulta.IdSubCategoria;
                    alterarProdutoModel.NomeProduto = consulta.NomeProduto;
                    alterarProdutoModel.ValorUnitario = consulta.ValorUnitario;
                    alterarProdutoModel.NomeSituacao = consulta.NomeSituacao;
                    alterarProdutoModel.DataAlteracao = consulta.DataAlteracao;
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
            return alterarProdutoModel;
        }

        public bool AlterarProdutoAdministrar(AlterarProdutosModel alterarProdutoModel)
        {
            System.Data.Common.DbTransaction transacao = null;
            _dbBon.Connection.Open();
            transacao = _dbBon.Connection.BeginTransaction();
            _dbBon.Transaction = transacao;

            bool retorno = false;

            try
            {
                TBL_PRODUTO produto = _dbBon.TBL_PRODUTOs.FirstOrDefault(x => x.COD_PRODUTO.Equals(alterarProdutoModel.IdProduto));

                produto.COD_PRODUTO = alterarProdutoModel.IdProduto;
                produto.NM_PRODUTO = alterarProdutoModel.NomeProduto;
                produto.COD_SUB_CATEGORIA = alterarProdutoModel.IdSubCategoria;
                produto.ST_ATIVO = alterarProdutoModel.NomeSituacao;
                produto.DH_ALTERACAO = DateTime.Now;

                _dbBon.SubmitChanges();

                transacao.Commit();

                retorno = true;
            }
            catch (Exception ex)
            {
                if (transacao != null)
                {
                    transacao.Rollback();
                }
                throw ex;
            }

            return retorno;
        }

        public bool AlterarProduto(AlterarProdutosModel alterarProdutoModel)
        {
            System.Data.Common.DbTransaction transacao = null;
            _dbBon.Connection.Open();
            transacao = _dbBon.Connection.BeginTransaction();
            _dbBon.Transaction = transacao;

            bool retorno = false;

            try
            {
                TBL_PRODUTO_DISTRIBUIDORA produtoDistribuidora = _dbBon.TBL_PRODUTO_DISTRIBUIDORAs.FirstOrDefault(x => x.COD_PRODUTO.Equals(alterarProdutoModel.IdProduto) && x.COD_DISTRIBUIDORA.Equals(alterarProdutoModel.IdDistribuidora));

                produtoDistribuidora.COD_DISTRIBUIDORA = alterarProdutoModel.IdDistribuidora;
                produtoDistribuidora.COD_PRODUTO = alterarProdutoModel.IdProduto;
                produtoDistribuidora.VL_UNITARIO = Convert.ToDecimal(alterarProdutoModel.ValorUnitario.Replace("R$", ""));
                produtoDistribuidora.ST_ATIVO = alterarProdutoModel.NomeSituacao;
                produtoDistribuidora.DH_ALTERACAO = DateTime.Now;           

                _dbBon.SubmitChanges();

                transacao.Commit();

                retorno = true;
            }
            catch (Exception ex)
            {
                if (transacao != null)
                {
                    transacao.Rollback();
                }
                throw ex;
            }

            return retorno;
        }

        public ProdutosView ExibirExcluirProdutoAdministrar(int IdProduto)
        {
            ProdutosView produtosView = new ProdutosView();
            try
            {
                var consulta = (from p in _dbBon.TBL_PRODUTOs
                                join sc in _dbBon.TBL_SUB_CATEGORIAs on
                                p.COD_SUB_CATEGORIA equals sc.COD_SUB_CATEGORIA
                                where p.COD_PRODUTO.Equals(IdProduto)
                                select new
                                {                                    
                                    _IdProduto = p.COD_PRODUTO,
                                    _Produto = p.NM_PRODUTO,
                                    _SubCategoria = sc.NM_SUB_CATEGORIA,                                    
                                    _Status = p.ST_ATIVO
                                }).FirstOrDefault();

                produtosView = new ProdutosView
                {
                    IdProduto = consulta._IdProduto,
                    NomeProduto = consulta._Produto,
                    SubCategoria = consulta._SubCategoria,                    
                    NomeSituacao = consulta._Status == true ? "Ativo" : "Inativo"
                };

                return produtosView;
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

        public bool ExcluirProdutoAdministrar(int IdProduto)
        {
            bool retorno = false;

            try
            {
                var consulta = (from p in _dbBon.TBL_PRODUTOs
                                where p.COD_PRODUTO.Equals(IdProduto)
                                select p).FirstOrDefault();

                _dbBon.TBL_PRODUTOs.DeleteOnSubmit(consulta);
                _dbBon.SubmitChanges();

                retorno = true;
            }
            catch (Exception ex)
            {
                throw ex;
            }
            return retorno;
        }

        public ProdutosView ExibirExcluirProduto(int IdProduto)
        {
            ProdutosView produtosView = new ProdutosView();
            try
            {
                var consulta = (from pd in _dbBon.TBL_PRODUTO_DISTRIBUIDORAs
                                join p in _dbBon.TBL_PRODUTOs on
                                pd.COD_PRODUTO equals p.COD_PRODUTO
                                where p.COD_PRODUTO.Equals(IdProduto)
                                select new
                                {
                                    _IdDistribuidora = pd.COD_DISTRIBUIDORA,
                                    _IdProduto = p.COD_PRODUTO,
                                    _Produto = p.NM_PRODUTO,
                                    _VlUnitario = pd.VL_UNITARIO,
                                    _Status = pd.ST_ATIVO
                                }).FirstOrDefault();

                produtosView = new ProdutosView
                {
                    IdProduto = consulta._IdProduto,
                    NomeProduto = consulta._Produto,
                    ValorUnitario = consulta._VlUnitario.ToString(),
                    NomeSituacao = consulta._Status == true ? "Ativo" : "Inativo"
                };

                return produtosView;
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

        public bool ExcluirProduto(int IdProduto)
        {
            bool retorno = false;

            try
            {
                var consulta = (from pd in _dbBon.TBL_PRODUTO_DISTRIBUIDORAs
                                where pd.COD_PRODUTO.Equals(IdProduto)
                                select pd).FirstOrDefault();

                _dbBon.TBL_PRODUTO_DISTRIBUIDORAs.DeleteOnSubmit(consulta);
                _dbBon.SubmitChanges();

                retorno = true;
            }
            catch (Exception ex)
            {
                throw ex;
            }
            return retorno;
        }

        public List<ProdutosView> ListarProdutoGerenciar(int IdProduto)
        {
            var lista = new List<ProdutosView>();

            var consulta = (from p in _dbBon.TBL_PRODUTOs
                            join sc in _dbBon.TBL_SUB_CATEGORIAs on
                            p.COD_SUB_CATEGORIA equals sc.COD_SUB_CATEGORIA
                            join c in _dbBon.TBL_CATEGORIAs on
                            sc.COD_CATEGORIA equals c.COD_CATEGORIA
                            orderby p.NM_PRODUTO ascending
                            where p.COD_PRODUTO.Equals(IdProduto)
                            select new ProdutosView
                            {
                                IdProduto = p.COD_PRODUTO,
                                NomeProduto = p.NM_PRODUTO,
                                SubCategoria = sc.NM_SUB_CATEGORIA,
                                Categoria = c.NM_CATEGORIA,
                                NomeSituacao = (bool)p.ST_ATIVO ? "Ativo" : "Inativo",
                                DataAlteracao = String.Format("{0:G}", (DateTime)p.DH_ALTERACAO)
                            });

            lista.AddRange(consulta.Select(item => new ProdutosView
            {
                IdProduto = item.IdProduto,
                NomeProduto = item.NomeProduto,
                SubCategoria = item.SubCategoria,
                Categoria = item.Categoria,
                NomeSituacao = item.NomeSituacao,
                DataAlteracao = item.DataAlteracao
            }));
            return lista;
        }

        public List<ProdutosView> ListarTodosProdutos()
        {
            var lista = new List<ProdutosView>();

            var consulta = (from p in _dbBon.TBL_PRODUTOs
                            where p.ST_ATIVO.Equals(true)
                            orderby p.NM_PRODUTO ascending
                            select new ProdutosView
                            {
                                IdProduto = p.COD_PRODUTO,
                                NomeProduto = p.NM_PRODUTO
                            });

            lista.AddRange(consulta.Select(item => new ProdutosView
                {
                    IdProduto = item.IdProduto,
                    NomeProduto = item.NomeProduto
                }));
            return lista;
        }

        public List<ProdutosView> ListarTodosProdutosAdministrar()
        {
            var lista = new List<ProdutosView>();

            var consulta = (from p in _dbBon.TBL_PRODUTOs                            
                            orderby p.NM_PRODUTO ascending
                            select new ProdutosView
                            {
                                IdProduto = p.COD_PRODUTO,
                                NomeProduto = p.NM_PRODUTO
                            });

            lista.AddRange(consulta.Select(item => new ProdutosView
            {
                IdProduto = item.IdProduto,
                NomeProduto = item.NomeProduto
            }));
            return lista;
        }

        public List<ProdutosView> ListarProdutos(int IdDistribuidora)
        {
            var lista = new List<ProdutosView>();

            var consulta = (from d in _dbBon.TBL_DISTRIBUIDORAs
                            join pd in _dbBon.TBL_PRODUTO_DISTRIBUIDORAs on
                            d.COD_DISTRIBUIDORA equals pd.COD_DISTRIBUIDORA
                            join p in _dbBon.TBL_PRODUTOs on
                            pd.COD_PRODUTO equals p.COD_PRODUTO
                            where d.COD_DISTRIBUIDORA == IdDistribuidora
                            select new ProdutosView
                            {
                                IdProduto = pd.COD_PRODUTO,
                                IdDistribuidora = d.COD_DISTRIBUIDORA,
                                Distribuidora = d.NM_DISTRIBUIDORA,
                                Endereco = d.DS_ENDERECO,
                                CidadeDistribuidora = d.NM_CIDADE,
                                EstadoDistribuidora = d.NM_UF,
                                Latitude = d.NR_LATITUDE,
                                Longitude = d.NR_LONGITUDE,
                                NomeProduto = p.NM_PRODUTO,
                                ValorUnitario = pd.VL_UNITARIO.ToString(),
                                NomeSituacao = pd.ST_ATIVO ? "Ativo" : "Inativo"
                            }).ToList();

            lista.AddRange(consulta.Select(item => new ProdutosView
            {
                IdDistribuidora = item.IdDistribuidora,
                IdProduto = item.IdProduto,
                NomeProduto = item.NomeProduto,
                Distribuidora = item.Distribuidora,
                Endereco = item.Endereco,
                CidadeDistribuidora = item.CidadeDistribuidora,
                EstadoDistribuidora = item.EstadoDistribuidora,
                Latitude = item.Latitude,
                Longitude = item.Longitude,
                ValorUnitario = item.ValorUnitario,
                NomeSituacao = item.NomeSituacao
            }));
            return lista;
        }

        public List<ProdutosView> ListarProdutosInicial(int IdDistribuidora, int IdProduto)
        {
            var lista = new List<ProdutosView>();

            var consulta = (from d in _dbBon.TBL_DISTRIBUIDORAs
                            join pd in _dbBon.TBL_PRODUTO_DISTRIBUIDORAs on
                            d.COD_DISTRIBUIDORA equals pd.COD_DISTRIBUIDORA
                            join p in _dbBon.TBL_PRODUTOs on
                            pd.COD_PRODUTO equals p.COD_PRODUTO
                            where d.COD_DISTRIBUIDORA == IdDistribuidora && pd.COD_PRODUTO.Equals(IdProduto) && pd.ST_ATIVO.Equals(true)
                            select new ProdutosView
                            {
                                IdProduto = pd.COD_PRODUTO,
                                IdDistribuidora = d.COD_DISTRIBUIDORA,
                                Distribuidora = d.NM_DISTRIBUIDORA,
                                Endereco = d.DS_ENDERECO,
                                CidadeDistribuidora = d.NM_CIDADE,
                                EstadoDistribuidora = d.NM_UF,
                                Latitude = d.NR_LATITUDE,
                                Longitude = d.NR_LONGITUDE,
                                NomeProduto = p.NM_PRODUTO,
                                ValorUnitario = pd.VL_UNITARIO.ToString(),
                                NomeSituacao = pd.ST_ATIVO ? "Ativo" : "Inativo"
                            }).ToList();

            lista.AddRange(consulta.Select(item => new ProdutosView
            {
                IdDistribuidora = item.IdDistribuidora,
                IdProduto = item.IdProduto,
                NomeProduto = item.NomeProduto,
                Distribuidora = item.Distribuidora,
                Endereco = item.Endereco,
                CidadeDistribuidora = item.CidadeDistribuidora,
                EstadoDistribuidora = item.EstadoDistribuidora,
                Latitude = item.Latitude,
                Longitude = item.Longitude,
                ValorUnitario = item.ValorUnitario,
                NomeSituacao = item.NomeSituacao
            }));
            return lista;
        }

        public List<ProdutosView> ListarProdutosInicial(int IdDistribuidora)
        {
            var lista = new List<ProdutosView>();

            var consulta = (from d in _dbBon.TBL_DISTRIBUIDORAs
                            join pd in _dbBon.TBL_PRODUTO_DISTRIBUIDORAs on
                            d.COD_DISTRIBUIDORA equals pd.COD_DISTRIBUIDORA
                            join p in _dbBon.TBL_PRODUTOs on
                            pd.COD_PRODUTO equals p.COD_PRODUTO
                            where d.COD_DISTRIBUIDORA == IdDistribuidora && pd.ST_ATIVO.Equals(true)
                            select new ProdutosView
                            {
                                IdProduto = pd.COD_PRODUTO,
                                IdDistribuidora = d.COD_DISTRIBUIDORA,
                                Distribuidora = d.NM_DISTRIBUIDORA,
                                Endereco = d.DS_ENDERECO,
                                CidadeDistribuidora = d.NM_CIDADE,
                                EstadoDistribuidora = d.NM_UF,
								Telefone = d.NR_TELEFONE,
								Celular = d.NR_CELULAR,
                                Latitude = d.NR_LATITUDE,
                                Longitude = d.NR_LONGITUDE,								
                                NomeProduto = p.NM_PRODUTO,
                                ValorUnitario = pd.VL_UNITARIO.ToString(),
                                NomeSituacao = pd.ST_ATIVO ? "Ativo" : "Inativo"
                            }).ToList();

            lista.AddRange(consulta.Select(item => new ProdutosView
            {
                IdDistribuidora = item.IdDistribuidora,
                IdProduto = item.IdProduto,
                NomeProduto = item.NomeProduto,
                Distribuidora = item.Distribuidora,
                Endereco = item.Endereco,
                CidadeDistribuidora = item.CidadeDistribuidora,
                EstadoDistribuidora = item.EstadoDistribuidora,
				Telefone = item.Telefone.Insert(0, "(").Insert(3, ")"),
				Celular = item.Celular.Insert(0, "(").Insert(3, ")"),
                Latitude = item.Latitude,
                Longitude = item.Longitude,
                ValorUnitario = item.ValorUnitario,
                NomeSituacao = item.NomeSituacao
            }));
            return lista;
        }

        public ProdutosView ListarProduto(int IdProduto)
        {
            ProdutosView produtoView = new ProdutosView();

            try
            {
                var consulta = (from pd in _dbBon.TBL_PRODUTO_DISTRIBUIDORAs
                                join p in _dbBon.TBL_PRODUTOs on
                                pd.COD_PRODUTO equals p.COD_PRODUTO
                                where pd.COD_PRODUTO == IdProduto
                                select new ProdutosView
                                {
                                    IdDistribuidora = pd.COD_DISTRIBUIDORA,
                                    IdProduto = pd.COD_PRODUTO,
                                    NomeProduto = p.NM_PRODUTO,
                                    ValorUnitario = pd.VL_UNITARIO.ToString(),
                                    NomeSituacao = pd.ST_ATIVO == true ? "Ativo" : "Inativo"
                                }).FirstOrDefault();

                if (consulta != null)
                {
                    produtoView.IdDistribuidora = consulta.IdDistribuidora;
                    produtoView.IdProduto = consulta.IdProduto;
                    produtoView.NomeProduto = consulta.NomeProduto;
                    produtoView.ValorUnitario = consulta.ValorUnitario;
                    produtoView.NomeSituacao = consulta.NomeSituacao;
                }
            }

            catch (Exception ex)
            {
                throw ex;
            }
            return produtoView;
        }

        public List<Categoria> ListarCategoria()
        {
            List<Categoria> lista = new List<Categoria>(100);

            try
            {
                var consulta = _dbBon.TBL_CATEGORIAs.ToList();

                lista.AddRange(consulta.Select(item => new Categoria
                {
                    IdCategoria = item.COD_CATEGORIA,
                    NomeCategoria = item.NM_CATEGORIA
                }));
                return lista;
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

        public Categoria ListarCategoria(int IdCategoria)
        {
            Categoria categoriaView;
            try
            {
                var consulta = _dbBon.TBL_CATEGORIAs.FirstOrDefault(x => x.COD_CATEGORIA.Equals(IdCategoria));

                categoriaView = new Categoria
                {
                    IdCategoria = consulta.COD_CATEGORIA,
                    NomeCategoria = consulta.NM_CATEGORIA
                };
                return categoriaView;
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

        public List<SubCategoria> ListarSubCategoria()
        {
            List<SubCategoria> lista = new List<SubCategoria>();

            try
            {
                var consulta = _dbBon.TBL_SUB_CATEGORIAs.ToList();

                lista.AddRange(consulta.Select(item => new SubCategoria
                    {
                        IdSubCategoria = item.COD_SUB_CATEGORIA,
                        NomeSubCategoria = item.NM_SUB_CATEGORIA
                    }));
                return lista;
            }
            catch (Exception ex)
            {
                throw new Exception(ex.Message);
            }
        }

        public List<SubCategoria> ListarSubCategoria(int IdCategoria)
        {
            List<SubCategoria> lista = new List<SubCategoria>();
            try
            {
                var consulta = _dbBon.TBL_SUB_CATEGORIAs.Where(x => x.COD_CATEGORIA.Equals(IdCategoria)).ToList();

                foreach (var item in consulta)
                {
                    SubCategoria subCategoria = new SubCategoria
                           {
                               IdSubCategoria = item.COD_SUB_CATEGORIA,
                               NomeSubCategoria = item.NM_SUB_CATEGORIA
                           };
                    lista.Add(subCategoria);
                }

                return lista;
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

        public List<Produto> ListarProdutosSubCategoria(int IdSubCategoria)
        {
            List<Produto> lista = new List<Produto>();
            try
            {
                var consulta = _dbBon.TBL_PRODUTOs.Where(x => x.COD_SUB_CATEGORIA == IdSubCategoria).ToList();

                lista.AddRange(consulta.Select(item => new Produto
                {
                    IdProduto = item.COD_PRODUTO,
                    IdSubCategoria = item.COD_SUB_CATEGORIA,
                    NomeProduto = item.NM_PRODUTO
                }));
                return lista;
            }
            catch (Exception ex)
            {
                throw new Exception(ex.Message);
            }
        }

        public List<ProdutosView> BuscarProdutoPorId(int IdProduto)
        {
            List<ProdutosView> lista = new List<ProdutosView>();
            try
            {
                var consulta = (from d in _dbBon.TBL_DISTRIBUIDORAs
                                join
                                    pd in _dbBon.TBL_PRODUTO_DISTRIBUIDORAs on
                                    d.COD_DISTRIBUIDORA equals pd.COD_DISTRIBUIDORA
                                where pd.COD_PRODUTO.Equals(IdProduto) && pd.ST_ATIVO.Equals(true)
                                select new ProdutosView
                                {
                                    IdDistribuidora = pd.COD_DISTRIBUIDORA,
                                    Latitude = d.NR_LATITUDE,
                                    Longitude = d.NR_LONGITUDE,
                                    Distribuidora = d.NM_DISTRIBUIDORA,
                                    Descricao = d.DS_DISTRIBUIDORA,
                                    Endereco = d.DS_ENDERECO,
                                    Telefone = d.NR_TELEFONE,
                                    Celular = d.NR_CELULAR,
                                    Email = d.DS_EMAIL,
                                    Bairro = d.DS_BAIRRO,
                                    CidadeDistribuidora = d.NM_CIDADE,
                                    EstadoDistribuidora = d.NM_UF,
                                    CEP = d.NR_CEP,
                                    Cnpj = d.NR_CNPJ
                                }).ToList();

                if (consulta.Count > 0)
                {
                    lista.AddRange(consulta.Select(item => new ProdutosView
                    {
                        IdDistribuidora = item.IdDistribuidora,
                        Latitude = item.Latitude,
                        Longitude = item.Longitude,
                        Distribuidora = item.Distribuidora,
                        Descricao = item.Descricao,
                        Endereco = item.Endereco,
                        Telefone = item.Telefone,
                        Celular = item.Celular,
                        Email = item.Email,
                        Bairro = item.Bairro,
                        CidadeDistribuidora = item.CidadeDistribuidora,
                        EstadoDistribuidora = item.EstadoDistribuidora,
                        CEP = item.CEP,
                        Cnpj = item.Cnpj
                    }));
                }
                return lista;
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

        public bool VerificaExisteProduto(string produto, int IdSubCategoria)
        {
            bool retorno = false;

            try
            {
                var consulta = _dbBon.TBL_PRODUTOs.Where(x => x.NM_PRODUTO.Equals(produto) && x.COD_SUB_CATEGORIA.Equals(IdSubCategoria)).ToList();

                if (consulta.Count > 0)
                {
                    retorno = true;
                }
                return retorno;
            }
            catch (Exception)
            {                
                throw;
            }
        }
    }
}
